//
//  MPBTools+FilePath.h
//  MiaoPai
//
//  Created by jiaxuzhou on 2017/6/26.
//  Copyright © 2017年 Jeakin. All rights reserved.
//
//


#import "MPBTools.h"
#import "MPBFilePath.h"


#define MPT_FilePathManager [MPBFilePath sharedInstance]

/**
 沙盒路径下的目录
 */
typedef enum : NSUInteger
{
    /// 沙盒主目录
    MPE_HomeDirectory,
    /// 沙盒主目录下的tmp目录
    MPE_TemporaryDirectory,
    /// 沙盒主目录下的Document目录
    MPE_DocumentDirectory,
    /// 沙盒主目录下的Library目录
    MPE_LibraryDirectory,
    /// 沙盒Library目录下的Caches目录
    MPE_CachesDirectory,
    /// 沙盒Library目录下的Preferences目录
    MPE_PreferencesDirectory,
    
}MPE_FilesDirectory;


@interface MPBTools (FilePath)


/**
 获取 MPBFilePath 单例

 @return MPBFilePath 单例对象
 */
+ (MPBFilePath *_Nullable)getGlobalFilePathManager;


#pragma mark -- 创建文件（夹）

/**
 创建文件夹

 @param path 文件夹全路径
 @param error 错误信息
 @return 是否创建成功
 */
+ (BOOL)createDirPath:(NSString *_Nullable)path
                error:(NSError * _Nullable __autoreleasing *_Nullable)error;

/**
 在个Cache目录下创建一个文件

 @param subPath Cache目录下的子目录
 @param fileName 文件名字
 @param type 文件类型
 @return 文件绝对路径
 */
+ (NSString *_Nullable)createFileInCachePathWithSubPath:(NSString *_Nullable)subPath
                                               fileName:(NSString *_Nullable)fileName
                                                 ofType:(NSString *_Nullable)type;


#pragma mark - 删除文件(夹)

/**
 删除文件或目录

 @param path 文件全路径 或 目录全路径
 @return 是否删除成功
 */
+ (BOOL)removeItemAtPath:(NSString *_Nullable)path;

/**
  删除文件或目录

 @param path 文件全路径 或 目录全路径
 @param error 错误信息
 @return 是否删除成功
 */
+ (BOOL)removeItemAtPath:(NSString *_Nullable)path
                   error:(NSError *_Nullable __autoreleasing *_Nullable)error;


#pragma mark -- 拷贝文件（夹）

/**
 拷贝文件夹到某一路径下
 
 @param path 原始文件夹路径
 @param toPath 目标文件夹路径
 @param cover 是否覆盖目标文件夹路径
 @param completionHandle 完成回调
 */
+ (void)copyItemAtPath:(NSString *_Nullable)path
               ToPath:(NSString *_Nullable)toPath
                Cover:(BOOL)cover
     CompletionHandle:(void(^_Nonnull)(BOOL finshed,NSError * _Nullable error))completionHandle;

/**
 拷贝文件到某一路径下

 @param path 原始文件路径
 @param toPath 目标文件路径
 @param cover 是否覆盖目标文件夹路径
 @param completionHandle 完成回调
 */
+ (void)copyItemAtFilePath:(NSString *_Nullable)path
               ToFilePath:(NSString *_Nullable)toPath
                    Cover:(BOOL)cover
          CompletionHandle:(void(^_Nonnull)(BOOL finshed,NSError * _Nullable error))completionHandle;


#pragma mark - 遍历文件夹

/**
 遍历文件夹

 @param path 文件夹路径
 @param deep 是否深度遍历文件夹
 @return 返回子目录数组
 */
+ (nullable NSArray * )listFilesInDirectoryAtPath:(nullable NSString *)path
                                             Deep:(BOOL)deep;

/**
 遍历文件夹

 @param filesDirectory 目录枚举
 @param deep 是否深度遍历文件夹
 @return 返回子目录数组
 */
+ (nullable NSArray *)listFilesInSearchPathDirectory:(MPE_FilesDirectory)filesDirectory
                                                Deep:(BOOL)deep;


#pragma mark - 根据URL获取文件名

/**
 获取文件名
 
 @param path 文件路径
 @param suffix 是否展示扩展名
 @return 文件名
 */
+ (NSString *_Nullable)fileNameAtPath:(NSString *_Nullable)path suffix:(BOOL)suffix;

/**
 获取文件路径的上一级路径
 
 @param path 文件路径
 @return 文件路径的上一级路径
 */
+ (NSString *_Nullable)directoryAtPath:(NSString *_Nullable)path;

/**
 获取文件路径的文件扩展名
 
 @param path 文件路径
 @return 文件路径的扩展名
 */
+ (NSString *_Nullable)suffixAtPath:(NSString *_Nullable)path;


#pragma mark - 获取文件属性

/**
 获取文件夹属性

 @param path 文件夹路径
 @return 属性字典
 */
+ (NSDictionary *_Nullable)attributesOfItemAtPath:(NSString *_Nullable)path;


#pragma mark - 获取文件(夹)大小

/**
 获取文件大小

 @param path 文件全路径
 @return 文件大小
 */
+ (NSNumber *_Nullable)sizeOfFileAtPath:(NSString *_Nullable)path;

/**
 获取文件夹大小

 @param path 文件夹全路径
 @return 文件夹大小
 */
+ (NSNumber *_Nullable)sizeOfDirectoryAtPath:(NSString *_Nullable)path;

/**
 清除缓存

 @return 清除缓存后的提示语
 */
+ (NSString *_Nullable)clearCache;


@end


@interface NSString (FilePath)


/**
 拼接文件路径
 */
- (NSString * _Nullable (^_Nullable)(NSString *_Nullable))subFileName;

/**
 创建文件目录
 */
- (NSString * _Nullable (^_Nullable)(NSString *_Nullable))subPathName;


@end
